<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=2">
<meta name="theme-color" content="#222">
<meta name="generator" content="Hexo 4.0.0">
  <link rel="apple-touch-icon" sizes="180x180" href="/images/apple-touch-icon-next.png">
  <link rel="icon" type="image/png" sizes="32x32" href="/images/favicon-32x32-next.png">
  <link rel="icon" type="image/png" sizes="16x16" href="/images/favicon-16x16-next.png">
  <link rel="mask-icon" href="/images/logo.svg" color="#222">
  <link rel="alternate" href="/atom.xml" title="dy2903的博客" type="application/atom+xml">

<link rel="stylesheet" href="/css/main.css">


<link rel="stylesheet" href="/lib/font-awesome/css/font-awesome.min.css">


<script id="hexo-configurations">
  var NexT = window.NexT || {};
  var CONFIG = {
    root: '/',
    scheme: 'Pisces',
    version: '7.5.0',
    exturl: false,
    sidebar: {"position":"left","display":"post","offset":12,"onmobile":false},
    copycode: {"enable":false,"show_result":false,"style":null},
    back2top: {"enable":true,"sidebar":false,"scrollpercent":false},
    bookmark: {"enable":false,"color":"#222","save":"auto"},
    fancybox: false,
    mediumzoom: false,
    lazyload: false,
    pangu: false,
    algolia: {
      appID: '',
      apiKey: '',
      indexName: '',
      hits: {"per_page":10},
      labels: {"input_placeholder":"Search for Posts","hits_empty":"We didn't find any results for the search: ${query}","hits_stats":"${hits} results found in ${time} ms"}
    },
    localsearch: {"enable":false,"trigger":"auto","top_n_per_article":1,"unescape":false,"preload":false},
    path: '',
    motion: {"enable":true,"async":false,"transition":{"post_block":"fadeIn","post_header":"slideDownIn","post_body":"slideDownIn","coll_header":"slideLeftIn","sidebar":"slideUpIn"}},
    translation: {
      copy_button: 'Copy',
      copy_success: 'Copied',
      copy_failure: 'Copy failed'
    },
    sidebarPadding: 40
  };
</script>

  <meta name="description" content="我们知道机械硬盘最大的缺点在于，寻道时间比较长，也就是不适合随机小块IO。所以这几年固态存储大行其道，因为它对任何地址访问的开销都相等，节省了机械寻道时间，所以随机IO性能很好。 当前的SSD硬盘，单块SSD的大块连续读吞吐量超过了350MB&#x2F;s，写超过了210MB&#x2F;s，甚至4K块随机读吞吐量超过了200MB&#x2F;s，写超过了180MB&#x2F;s，随机读IOPS超过了600，随机IO延迟不超过1ms。这种速">
<meta name="keywords" content="存储  学习笔记">
<meta property="og:type" content="article">
<meta property="og:title" content="大话存储，学习笔记（2章），SSD">
<meta property="og:url" content="https:&#x2F;&#x2F;duyang2903.gitee.io&#x2F;2017&#x2F;11&#x2F;15&#x2F;%E5%A4%A7%E8%AF%9D%E5%AD%98%E5%82%A8%EF%BC%8C%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0%EF%BC%882%E7%AB%A0%EF%BC%89%EF%BC%8C-SSD&#x2F;index.html">
<meta property="og:site_name" content="dy2903的博客">
<meta property="og:description" content="我们知道机械硬盘最大的缺点在于，寻道时间比较长，也就是不适合随机小块IO。所以这几年固态存储大行其道，因为它对任何地址访问的开销都相等，节省了机械寻道时间，所以随机IO性能很好。 当前的SSD硬盘，单块SSD的大块连续读吞吐量超过了350MB&#x2F;s，写超过了210MB&#x2F;s，甚至4K块随机读吞吐量超过了200MB&#x2F;s，写超过了180MB&#x2F;s，随机读IOPS超过了600，随机IO延迟不超过1ms。这种速">
<meta property="og:locale" content="en">
<meta property="og:image" content="http:&#x2F;&#x2F;upload-images.jianshu.io&#x2F;upload_images&#x2F;1323506-b9ebb5155632d2b5.png?imageMogr2&#x2F;auto-orient&#x2F;strip%7CimageView2&#x2F;2&#x2F;w&#x2F;1240">
<meta property="og:image" content="http:&#x2F;&#x2F;upload-images.jianshu.io&#x2F;upload_images&#x2F;1323506-86ef5cc0e71ba221.png?imageMogr2&#x2F;auto-orient&#x2F;strip%7CimageView2&#x2F;2&#x2F;w&#x2F;1240">
<meta property="og:image" content="http:&#x2F;&#x2F;upload-images.jianshu.io&#x2F;upload_images&#x2F;1323506-27356910307c5d4d.png?imageMogr2&#x2F;auto-orient&#x2F;strip%7CimageView2&#x2F;2&#x2F;w&#x2F;1240">
<meta property="og:image" content="http:&#x2F;&#x2F;upload-images.jianshu.io&#x2F;upload_images&#x2F;1323506-645aa5d6903a16a7.png?imageMogr2&#x2F;auto-orient&#x2F;strip%7CimageView2&#x2F;2&#x2F;w&#x2F;1240">
<meta property="og:image" content="http:&#x2F;&#x2F;upload-images.jianshu.io&#x2F;upload_images&#x2F;1323506-6c958bb8ec1bd367.png?imageMogr2&#x2F;auto-orient&#x2F;strip%7CimageView2&#x2F;2&#x2F;w&#x2F;1240">
<meta property="og:image" content="http:&#x2F;&#x2F;upload-images.jianshu.io&#x2F;upload_images&#x2F;1323506-7ecaaa6bc1da40df.png?imageMogr2&#x2F;auto-orient&#x2F;strip%7CimageView2&#x2F;2&#x2F;w&#x2F;1240">
<meta property="og:image" content="http:&#x2F;&#x2F;upload-images.jianshu.io&#x2F;upload_images&#x2F;1323506-9684c0ca3ed8e9b1.png?imageMogr2&#x2F;auto-orient&#x2F;strip%7CimageView2&#x2F;2&#x2F;w&#x2F;1240">
<meta property="og:image" content="http:&#x2F;&#x2F;upload-images.jianshu.io&#x2F;upload_images&#x2F;1323506-2cc75431eff51aab.png?imageMogr2&#x2F;auto-orient&#x2F;strip%7CimageView2&#x2F;2&#x2F;w&#x2F;1240">
<meta property="og:image" content="http:&#x2F;&#x2F;upload-images.jianshu.io&#x2F;upload_images&#x2F;1323506-c9e97f42277d8bb9.png?imageMogr2&#x2F;auto-orient&#x2F;strip%7CimageView2&#x2F;2&#x2F;w&#x2F;1240">
<meta property="og:image" content="http:&#x2F;&#x2F;upload-images.jianshu.io&#x2F;upload_images&#x2F;1323506-251fff33dddee99c.png?imageMogr2&#x2F;auto-orient&#x2F;strip%7CimageView2&#x2F;2&#x2F;w&#x2F;1240">
<meta property="og:updated_time" content="2019-11-15T03:21:59.341Z">
<meta name="twitter:card" content="summary">
<meta name="twitter:image" content="http:&#x2F;&#x2F;upload-images.jianshu.io&#x2F;upload_images&#x2F;1323506-b9ebb5155632d2b5.png?imageMogr2&#x2F;auto-orient&#x2F;strip%7CimageView2&#x2F;2&#x2F;w&#x2F;1240">

<link rel="canonical" href="https://duyang2903.gitee.io/2017/11/15/%E5%A4%A7%E8%AF%9D%E5%AD%98%E5%82%A8%EF%BC%8C%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0%EF%BC%882%E7%AB%A0%EF%BC%89%EF%BC%8C-SSD/">


<script id="page-configurations">
  // https://hexo.io/docs/variables.html
  CONFIG.page = {
    sidebar: "",
    isHome: false,
    isPost: true,
    isPage: false,
    isArchive: false
  };
</script>

  <title>大话存储，学习笔记（2章），SSD | dy2903的博客</title>
  






  <noscript>
  <style>
  .use-motion .brand,
  .use-motion .menu-item,
  .sidebar-inner,
  .use-motion .post-block,
  .use-motion .pagination,
  .use-motion .comments,
  .use-motion .post-header,
  .use-motion .post-body,
  .use-motion .collection-header { opacity: initial; }

  .use-motion .site-title,
  .use-motion .site-subtitle {
    opacity: initial;
    top: initial;
  }

  .use-motion .logo-line-before i { left: initial; }
  .use-motion .logo-line-after i { right: initial; }
  </style>
</noscript>

</head>

<body itemscope itemtype="http://schema.org/WebPage">
  <div class="container use-motion">
    <div class="headband"></div>

    <header class="header" itemscope itemtype="http://schema.org/WPHeader">
      <div class="header-inner"><div class="site-brand-container">
  <div class="site-meta">

    <div>
      <a href="/" class="brand" rel="start">
        <span class="logo-line-before"><i></i></span>
        <span class="site-title">dy2903的博客</span>
        <span class="logo-line-after"><i></i></span>
      </a>
    </div>
        <p class="site-subtitle">与肝胆人共事，从无字句读书</p>
  </div>

  <div class="site-nav-toggle">
    <div class="toggle" aria-label="Toggle navigation bar">
      <span class="toggle-line toggle-line-first"></span>
      <span class="toggle-line toggle-line-middle"></span>
      <span class="toggle-line toggle-line-last"></span>
    </div>
  </div>
</div>


<nav class="site-nav">
  
  <ul id="menu" class="menu">
        <li class="menu-item menu-item-home">

    <a href="/" rel="section"><i class="fa fa-fw fa-home"></i>Home</a>

  </li>
        <li class="menu-item menu-item-archives">

    <a href="/archives/" rel="section"><i class="fa fa-fw fa-archive"></i>Archives</a>

  </li>
  </ul>

</nav>
</div>
    </header>

    
  <div class="back-to-top">
    <i class="fa fa-arrow-up"></i>
    <span>0%</span>
  </div>


    <main class="main">
      <div class="main-inner">
        <div class="content-wrap">
          

          <div class="content">
            

  <div class="posts-expand">
      
  
  
  <article itemscope itemtype="http://schema.org/Article" class="post-block " lang="en">
    <link itemprop="mainEntityOfPage" href="https://duyang2903.gitee.io/2017/11/15/%E5%A4%A7%E8%AF%9D%E5%AD%98%E5%82%A8%EF%BC%8C%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0%EF%BC%882%E7%AB%A0%EF%BC%89%EF%BC%8C-SSD/">

    <span hidden itemprop="author" itemscope itemtype="http://schema.org/Person">
      <meta itemprop="image" content="/images/avatar.gif">
      <meta itemprop="name" content="dy2903">
      <meta itemprop="description" content="">
    </span>

    <span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization">
      <meta itemprop="name" content="dy2903的博客">
    </span>
      <header class="post-header">
        <h1 class="post-title" itemprop="name headline">
          大话存储，学习笔记（2章），SSD
        </h1>

        <div class="post-meta">
            <span class="post-meta-item">
              <span class="post-meta-item-icon">
                <i class="fa fa-calendar-o"></i>
              </span>
              <span class="post-meta-item-text">Posted on</span>

              <time title="Created: 2017-11-15 00:00:00" itemprop="dateCreated datePublished" datetime="2017-11-15T00:00:00+08:00">2017-11-15</time>
            </span>
              <span class="post-meta-item">
                <span class="post-meta-item-icon">
                  <i class="fa fa-calendar-check-o"></i>
                </span>
                <span class="post-meta-item-text">Edited on</span>
                <time title="Modified: 2019-11-15 11:21:59" itemprop="dateModified" datetime="2019-11-15T11:21:59+08:00">2019-11-15</time>
              </span>

          

        </div>
      </header>

    
    
    
    <div class="post-body" itemprop="articleBody">

      
        <p>我们知道机械硬盘最大的缺点在于，寻道时间比较长，也就是不适合随机小块IO。所以这几年固态存储大行其道，因为它对任何地址访问的开销都相等，节省了机械寻道时间，所以随机IO性能很好。</p>
<p>当前的SSD硬盘，单块SSD的大块连续读吞吐量超过了350MB/s，写超过了210MB/s，甚至4K块随机读吞吐量超过了200MB/s，写超过了180MB/s，随机读IOPS超过了600，随机IO延迟不超过1ms。这种速度满足当前主流的架构不成问题。</p>
<h1 id="SSD固态硬盘的硬件组成"><a href="#SSD固态硬盘的硬件组成" class="headerlink" title="SSD固态硬盘的硬件组成"></a>SSD固态硬盘的硬件组成</h1><blockquote>
<p>SSD(Solid State Drive)：是一种利用Flash芯片或者DRAM芯片作为数据永久存储的硬盘。所以不再使用磁技术来存储数据。</p>
</blockquote>
<ul>
<li><p>利用DRAM作为永久存储介质的SSD，又称为RAM-Disk，使用DRAM内存条来存储数据，所以在外部电池断开后，需要使用电池来维持DRAM中的数据。</p>
</li>
<li><p>基于Flash介质的SSD：使用“浮动门场效应晶体管”的晶体管来保存数据，每个这样的晶体管叫做一个“Cell”，即单元。有两种类型的单元：</p>
<ul>
<li><p>Single Level Cell(SLC)：每个单元可以保存1B的数据</p>
</li>
<li><p>Mult Level Cell(MLC)：每个单元可以保存2B的数据。所以MLC容量是SLC的两倍，成本却与SLC大致相当。但因为MLC的每个单元需要存储2B，所以复杂度比较高，出错率自然比较高。</p>
</li>
</ul>
</li>
</ul>
<h2 id="Flash-芯片"><a href="#Flash-芯片" class="headerlink" title="Flash 芯片"></a>Flash 芯片</h2><h3 id="Cell"><a href="#Cell" class="headerlink" title="Cell"></a>Cell</h3><p>本节我们介绍一下Cell的构成，这就是<strong>SSD可以在掉电后不丢失信息的原因</strong><br><img src="http://upload-images.jianshu.io/upload_images/1323506-b9ebb5155632d2b5.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="image.png"></p>
<p>SSD是由浮动门构成的，所谓<strong>浮动门</strong>是一个逻辑电路，四周被$SiO_2$包裹着。在Word Line（字线）上抬高电势，电子存储在浮动门中，字线恢复电势，电子不会丢失，也就是说浮动门仍然是充电的。</p>
<p><strong>那么什么时候状态为0，什么时候状态为1呢</strong>？充电到一定电势的后表示0，电势降到一定的阈值以后，表示为1。</p>
<p>在前面我们说过，MLC可以在一个Cell里面保存多位，也就是一个Cell可以有多种电势阈值，这样就可以表示00,01,11,10 4种状态。</p>
<h3 id="Cell串"><a href="#Cell串" class="headerlink" title="Cell串"></a>Cell串</h3><p>把多个Cell串联起来，就组成了<strong>Cell串</strong>。对每个cell串，每次只能读写其中一个Cell，所以我们会把多个Cell串并联起来，并行操作，这样就可以读多位数据呢。</p>
<p><img src="http://upload-images.jianshu.io/upload_images/1323506-86ef5cc0e71ba221.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="image.png"></p>
<p>NADD就是由这种晶体管有序排列起来的Flash芯片。每4314<em>8=34512个Cell组成一个Page，当然这只是逻辑上，它是IO的最小单位。每个Page可以存放*</em>4KB的内容**。</p>
<p>每128个Page组成一个Block，每2048个Block组成一个Plane区域。而一个Flash芯片由两个区域组称，一个存储奇数序号，另一个存储偶数序号。</p>
<p><img src="http://upload-images.jianshu.io/upload_images/1323506-27356910307c5d4d.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="image.png"></p>
<h2 id="SSD固态盘的构成"><a href="#SSD固态盘的构成" class="headerlink" title="SSD固态盘的构成"></a>SSD固态盘的构成</h2><p>上面我们讲解了NAND Flash芯片的主要构成部分，现在我们来看SSD固态盘的整体构成。</p>
<p>下图为Intel X-25M固态硬盘的拆机图。里面包含：</p>
<ul>
<li>10片NAND  Flash芯片</li>
<li>SSD控制器</li>
<li>RAM  Buffer</li>
</ul>
<p><img src="http://upload-images.jianshu.io/upload_images/1323506-645aa5d6903a16a7.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="image.png"></p>
<p>SSD控制器芯片负责向所有的NAND Flash芯片执行读写任务，同样也就通过指令的方式来运作，因为地址信息和数据信息都在这8位的总线上传送，加上总线位宽太窄，所以一个简单的寻址都需要多个时钟周期才能仅完成。</p>
<p>我们知道芯片容量越大，地址就会越长，寻址时间也就会越长，<strong>对小块随机IO，Flash会随着容量的增加而变得越来越低效。</strong></p>
<p><img src="http://upload-images.jianshu.io/upload_images/1323506-6c958bb8ec1bd367.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="image.png"></p>
<h2 id="读写数据流程"><a href="#读写数据流程" class="headerlink" title="读写数据流程"></a>读写数据流程</h2><p>下面来看一下读写操作都需要做哪些工作？</p>
<h3 id="如何读数据"><a href="#如何读数据" class="headerlink" title="如何读数据"></a>如何读数据</h3><p>当需要读某个Page时，Flash控制器将这个Page的字线组电势置为0，可以将电势值解码成1或者0，放到SSD的RAM Buffer中。</p>
<p>从上述过程就可以看出<strong>SSD的最小IO单位为1个Page</strong></p>
<p><img src="http://upload-images.jianshu.io/upload_images/1323506-7ecaaa6bc1da40df.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="image.png"></p>
<h3 id="如何写数据"><a href="#如何写数据" class="headerlink" title="如何写数据"></a>如何写数据</h3><p><strong>Flash芯片要求在修改一个Cell中的位之前，必须擦除这个Cell。</strong>其实这个擦除动作就是将一个<strong>Block</strong>一下全<strong>放电</strong>。也就是每次擦除只能一下擦除整个Block，将所有的Cell全置1。</p>
<p>这就是SSD的一个非常致命的缺点，它不能单独擦除某个Page或者Cell</p>
<p>擦除完毕以后，SSD会以Page为单位进行写入。<br><img src="http://upload-images.jianshu.io/upload_images/1323506-9684c0ca3ed8e9b1.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="image.png"></p>
<h1 id="SSD的问题"><a href="#SSD的问题" class="headerlink" title="SSD的问题"></a>SSD的问题</h1><h2 id="SSD天然的缺陷"><a href="#SSD天然的缺陷" class="headerlink" title="SSD天然的缺陷"></a>SSD天然的缺陷</h2><p>Flash芯片在写入数据的时候有很多效率低下的地方，这是Flash芯片的通病</p>
<ul>
<li><p>擦除前需要将整个Block清掉（Erase before overwrite）</p>
<p>  上面我们讲到过如果要写入数据，必须先Erase整个Block，而不只是把一个Page或者Cell给清掉。相比于机械磁盘，多了擦除的这个步骤。</p>
</li>
</ul>
<p>特别是如果仅仅需要更改某个Page的内容，却需要擦除整个Block，性能浪费很严重。我们可以看看修改只修改某个Page的过程，</p>
<ul>
<li><p>在擦除之前，先将Block的数据读入RAM中，</p>
</li>
<li><p>然后擦除整个Block，</p>
</li>
<li><p>再更新RAM中的对应Page，写回Flash芯片中</p>
</li>
</ul>
<p><strong>这也是SSD的缓存通常比较大的原因。</strong></p>
<p>这就叫做写扩大，我们姑且称之为<strong>写惩罚</strong></p>
<p>这个时候我们会问， 为什么如果只需要修改一个Cell，却需要把Block放电？</p>
<p>因为Cell之间是存在干扰的，如果有的在充电，有的在放电，则会产生不可控的干扰问题。所以不如直接将所有的先放电。</p>
<p>那 为什么需要一次擦一个Block，而不是一个Page？</p>
<p>这是管理粒度的问题，粒度越小，管理开销越大，所以一次擦一个Block是一种比较折中的方案。</p>
<p>不过幸好，向Free Space写入数据时，因为里面没有被写过，所以不需要擦除，当然<strong>没有写惩罚</strong>。</p>
<p><strong>但是另一个问题又来了，SSD如何知道哪些是Free Space？</strong></p>
<p>我们知道只有文件系统才知道硬盘上哪些数据是有用的，它会使用元数据来进行记录，即使是删除一份数据也只是修改了元数据，而不是把数据真正的删除掉。</p>
<p>这样看来，SSD其实是不知道硬盘上哪些地方是所谓的Free Space，它只会把数据往从来没修过的地方写，所以Free Space会越来越少。</p>
<ul>
<li>Wear Off：</li>
</ul>
<p>什么是Wear off？就是逻辑门充放电次数过多，$SiO_2$绝缘层的绝缘能力遭到损耗，逐渐不再绝缘，无法保证有充足的电荷，也就是Cell已经物理损坏了。</p>
<p>更糟糕的是，损坏的Cell会拖累整个Page，因为最小的寻址单位是Page。这个Page的逻辑地址会被重定向到其他的Page上</p>
<p>MLC因为器件复杂，可擦写的寿命小于10000次，而SLC则十倍于MLC，小于100000次。<br><img src="http://upload-images.jianshu.io/upload_images/1323506-2cc75431eff51aab.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="image.png"></p>
<h2 id="如何解决？"><a href="#如何解决？" class="headerlink" title="如何解决？"></a>如何解决？</h2><p>之前我们提到SSD在写上有会极大的写惩罚，而且会加速Wear off，有什么好的解决方案？</p>
<ul>
<li><p>方法一：拆东墙补西墙重定向写</p>
<p>  如果同一个Cell被高频擦写，那么它被损坏的几率当然增大。如果一个Page之前都被写过了，我们不如把所有针对这个Page的写请求重定向到Free Space上.</p>
<p>  这样的好处在于对Free Space的写是不需要提前<strong>擦除</strong>的，减少了擦除次数。不过这些被写过的Page也不能浪费了，我们可以把他们标为”Garbage”，等待比较多的时候，再<strong>批量</strong>回收。</p>
<p>  这样做的目的是将写操作平衡到所有可能的Block中，降低单位时间内的每个Block擦写次数。问题是，Free Space会越来越少，重定向写的几率也会越来越少，最后降为0.</p>
<p>  而且因为有重定向，SSD内部很定需要维护一个<strong>地址映射表</strong>，需要SSD的CPU能维护一定比较复杂的程序，称为<code>wear Leveling</code>(损耗平衡算法)</p>
</li>
<li><p>方法二：定期清垃圾</p>
<p>  前面我们说过SSD自己是不知道哪些空间是Free Space，但是文件系统知道，可以在操作系统里面运行一种Wiper，可以不断扫描，然后把空闲空间通知给SSD，由SSD来执行擦除工作。</p>
<p>  不过这种清除工作只能定期执行</p>
</li>
<li><p>方法三：持续清除体内垃圾</p>
<p>  有没有办法可以让文件系统在删除之后实时通知SSD。</p>
<p>  可以使用ATA指令里面一个功能——TRIM，现在已经集成在很多SSD的Firmware中了。</p>
</li>
<li><p>方法四：IO 优化</p>
<p>  之前的方法主要着力点在Free Space。我们也可以采用另一种思路，对IO进行优化。<br>  比如<strong>Delay write</strong>。现在有两个针对同一个地址的写IO，在Write1还没写到硬盘之前，Write 2就到了，控制器直接用Write 2来覆盖Write 1 ，这个操作是在<strong>内存里面</strong>的，省去了Write 1 写入硬盘的过程。这种机制为“写命中”的一种情况。</p>
<p>  问题就是数据可能不一致。比如有如下IO：Write 1 , Read 2 , Write 3 ，此时如果用Write 3取代Write 1，那么Read 2 读出了Write 3 的内容，实际上Read 2应该读Write 1的内容，所以数据不一致。</p>
<p>  另外还可以使用<strong>Combine Write</strong>，对机械硬盘来说，如果控制器一段时间内收到多个写IO，而这些写IO的地址在逻辑上是连续的，可以将小写IO合并为大IO，一次性写入，节约了SCSI指令周期。<br>  对SSD来说，逻辑地址和物理地址存在一个映射关系，我们读数据的时候是根据这个映射关系来的，所以可以任何地址的小IO整合为大IO，直接写到Free的Block中。</p>
<p>  因为SSD需要对数据进行合并以及优化，所以SSD对收到的写数据一般采用Write Back模式，即收到主机控制器的数据立即返回成功，然后异步处理。这样就存在一个风险，如果掉电了，数据就会丢失，所以SSD是需要掉电保护机制的，一般使用一个超级电容来维持掉电之后的脏数据刷盘。</p>
</li>
<li><p>预留备用空间</p>
<p>  为了防止文件系统将数据写满的极端情况，SSD可以自己预留一部分备用空间用于重定向写，因为不通知文件系统，所以只有SSD才知道，这样就有了一个永远不会被占用的定额Free Space。</p>
</li>
</ul>
<p>下面说一个题外话， 为什么不需要对SSD进行碎片整理？</p>
<p>我们来看一下机械硬盘为什么需要进行碎片整理？机械硬盘主要瓶颈在于寻道时间，因为碎片是不零散的块，寻道次数会很多。整合到一起呢，逻辑上连续的LBA地址同样也是物理上连续的，磁盘臂换道的时间就少了。</p>
<p>但是对SSD而言，没有了磁盘臂，它是通过映射关系来读的，即使整理了碎片也没啥用。反而做了大堆无用功，还会减少SSD的寿命。</p>
<p><img src="http://upload-images.jianshu.io/upload_images/1323506-c9e97f42277d8bb9.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="image.png"></p>
<h2 id="SSD如何处理Cell损坏"><a href="#SSD如何处理Cell损坏" class="headerlink" title="SSD如何处理Cell损坏"></a>SSD如何处理Cell损坏</h2><p>机械硬盘如果损坏，则该扇区不能磁化，磁头会感知。</p>
<p>而Flash中的Cell被击穿一定次数后，损坏的几率很高，</p>
<p>SSD如何判断损坏的呢？实际上Cell只有充电和没充电两种状态，那么电路实际上无法直接判断是漏电导致的还是说原本就是没电的。</p>
<p><strong>只好使用ECC纠错码</strong>，每次读出某个Page需要进行ECC校验。Flash厂商会在Datasheet中给出最低要求，即使用该颗粒起码配合使用何种力度的纠错码。比如8b@512B，意味着512B的范围内出现8b错误，可以纠错。如果超过了，就只能上报“不可恢复错误”。</p>
<p><strong>厂商给出的纠错码力度越低，说明颗粒的品质越好，损坏率越低。</strong></p>
<p><img src="http://upload-images.jianshu.io/upload_images/1323506-251fff33dddee99c.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="image.png"></p>
<h2 id="SSD的前景"><a href="#SSD的前景" class="headerlink" title="SSD的前景"></a>SSD的前景</h2><p>以上缓解SSD效率的问题都是治标不治本的，为了解决多个问题，设计了若干的补救措施，需要TRIM来维持，而且数据不能占得太满。SSD在使用的时候也略显尴尬，因为成本太高，用户若需要一个10TB的存储系统，不可能都用SSD，所以很多厂商出品了SSD + HDD混合存储，其实就是将Flash芯片作为磁盘的二级缓存，一级缓存是RAM，二级是FLASH，三级是磁盘片。</p>
<p>有人说传统磁盘有64MB的RAM缓存，为什么还需要Flash作为下一级的缓存？如果只用磁盘的RAM，首先空间比较小，很快就塞满了，另外不能掉电，刷到盘片里面的时候，会导致性能骤降。</p>
<p>而使用Flash芯片再加一级缓存，可以把RAM中的数据存储Flash中，最关键的是可以掉电，这样可以直接回复给控制器成功之后，磁盘驱动器再在后台将数据从Flash中写到磁盘片中，这样既比纯SSD便宜，还保证了性能。</p>

    </div>

    
    
    

      <footer class="post-footer">
          <div class="post-tags">
              <a href="/tags/%E5%AD%98%E5%82%A8-%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/" rel="tag"># 存储  学习笔记</a>
          </div>

        

          <div class="post-nav">
            <div class="post-nav-next post-nav-item">
                <a href="/2017/11/14/%E5%A4%A7%E8%AF%9D%E5%AD%98%E5%82%A8%EF%BC%8C%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0%EF%BC%881,2,3%E7%AB%A0%EF%BC%89%EF%BC%8C%E7%A3%81%E7%9B%98/" rel="next" title="大话存储，学习笔记（1,2,3章），磁盘.md">
                  <i class="fa fa-chevron-left"></i> 大话存储，学习笔记（1,2,3章），磁盘.md
                </a>
            </div>

            <span class="post-nav-divider"></span>

            <div class="post-nav-prev post-nav-item">
                <a href="/2019/11/15/%E5%A4%A7%E8%AF%9D%E5%AD%98%E5%82%A8%EF%BC%8C%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0%EF%BC%8815%E7%AB%A0%EF%BC%89%EF%BC%8C%E6%96%87%E4%BB%B6%E7%BA%A7%E9%9B%86%E7%BE%A4%E7%B3%BB%E7%BB%9F/" rel="prev" title="大话存储，学习笔记（15章），文件级集群系统">
                  大话存储，学习笔记（15章），文件级集群系统 <i class="fa fa-chevron-right"></i>
                </a>
            </div>
          </div>
      </footer>
    
  </article>
  
  
  

  </div>


          </div>
          

        </div>
          
  
  <div class="toggle sidebar-toggle">
    <span class="toggle-line toggle-line-first"></span>
    <span class="toggle-line toggle-line-middle"></span>
    <span class="toggle-line toggle-line-last"></span>
  </div>

  <aside class="sidebar">
    <div class="sidebar-inner">

      <ul class="sidebar-nav motion-element">
        <li class="sidebar-nav-toc">
          Table of Contents
        </li>
        <li class="sidebar-nav-overview">
          Overview
        </li>
      </ul>

      <!--noindex-->
      <div class="post-toc-wrap sidebar-panel">
          <div class="post-toc motion-element"><ol class="nav"><li class="nav-item nav-level-1"><a class="nav-link" href="#SSD固态硬盘的硬件组成"><span class="nav-number">1.</span> <span class="nav-text">SSD固态硬盘的硬件组成</span></a><ol class="nav-child"><li class="nav-item nav-level-2"><a class="nav-link" href="#Flash-芯片"><span class="nav-number">1.1.</span> <span class="nav-text">Flash 芯片</span></a><ol class="nav-child"><li class="nav-item nav-level-3"><a class="nav-link" href="#Cell"><span class="nav-number">1.1.1.</span> <span class="nav-text">Cell</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#Cell串"><span class="nav-number">1.1.2.</span> <span class="nav-text">Cell串</span></a></li></ol></li><li class="nav-item nav-level-2"><a class="nav-link" href="#SSD固态盘的构成"><span class="nav-number">1.2.</span> <span class="nav-text">SSD固态盘的构成</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#读写数据流程"><span class="nav-number">1.3.</span> <span class="nav-text">读写数据流程</span></a><ol class="nav-child"><li class="nav-item nav-level-3"><a class="nav-link" href="#如何读数据"><span class="nav-number">1.3.1.</span> <span class="nav-text">如何读数据</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#如何写数据"><span class="nav-number">1.3.2.</span> <span class="nav-text">如何写数据</span></a></li></ol></li></ol></li><li class="nav-item nav-level-1"><a class="nav-link" href="#SSD的问题"><span class="nav-number">2.</span> <span class="nav-text">SSD的问题</span></a><ol class="nav-child"><li class="nav-item nav-level-2"><a class="nav-link" href="#SSD天然的缺陷"><span class="nav-number">2.1.</span> <span class="nav-text">SSD天然的缺陷</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#如何解决？"><span class="nav-number">2.2.</span> <span class="nav-text">如何解决？</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#SSD如何处理Cell损坏"><span class="nav-number">2.3.</span> <span class="nav-text">SSD如何处理Cell损坏</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#SSD的前景"><span class="nav-number">2.4.</span> <span class="nav-text">SSD的前景</span></a></li></ol></li></ol></div>
      </div>
      <!--/noindex-->

      <div class="site-overview-wrap sidebar-panel">
        <div class="site-author motion-element" itemprop="author" itemscope itemtype="http://schema.org/Person">
  <p class="site-author-name" itemprop="name">dy2903</p>
  <div class="site-description" itemprop="description"></div>
</div>
<div class="site-state-wrap motion-element">
  <nav class="site-state">
      <div class="site-state-item site-state-posts">
          <a href="/archives/">
        
          <span class="site-state-item-count">20</span>
          <span class="site-state-item-name">posts</span>
        </a>
      </div>
      <div class="site-state-item site-state-tags">
        <span class="site-state-item-count">2</span>
        <span class="site-state-item-name">tags</span>
      </div>
  </nav>
</div>
  <div class="feed-link motion-element">
    <a href="/atom.xml" rel="alternate">
      <i class="fa fa-rss"></i>RSS
    </a>
  </div>



      </div>

    </div>
  </aside>
  <div id="sidebar-dimmer"></div>


      </div>
    </main>

    <footer class="footer">
      <div class="footer-inner">
        

<div class="copyright">
  
  &copy; 
  <span itemprop="copyrightYear">2019</span>
  <span class="with-love">
    <i class="fa fa-user"></i>
  </span>
  <span class="author" itemprop="copyrightHolder">dy2903</span>
</div>
  <div class="powered-by">Powered by <a href="https://hexo.io/" class="theme-link" rel="noopener" target="_blank">Hexo</a> v4.0.0
  </div>
  <span class="post-meta-divider">|</span>
  <div class="theme-info">Theme – <a href="https://pisces.theme-next.org/" class="theme-link" rel="noopener" target="_blank">NexT.Pisces</a> v7.5.0
  </div>

        












        
      </div>
    </footer>
  </div>

  
  <script src="/lib/anime.min.js"></script>
  <script src="/lib/velocity/velocity.min.js"></script>
  <script src="/lib/velocity/velocity.ui.min.js"></script>
<script src="/js/utils.js"></script><script src="/js/motion.js"></script>
<script src="/js/schemes/pisces.js"></script>
<script src="/js/next-boot.js"></script>



  
















  

  

</body>
</html>
